<?php
/**
 * @Name AuthGroup 
 * @Title 角色控制器 
 * @Extends app\admin\controller\AdminCore 
 * @Modifiers public
 * @Auth Ghj<912524639@qq.com> 
 * @Time 2018年08月17日 
 * @Site http:// www.thinkgms.com/ 
 */
namespace app\admin\controller;
use app\admin\controller\AdminCore;

class AuthGroup extends AdminCore {
	
	//当前控制器的模型
	protected $Model;
	
	//当前控制器的数据表
	protected $Db;
	
	//当前控制器的验证器
	protected $Validate;
	
	//当前控制器的主键
	protected $Pk='id';
	
	//当前控制器的父键
	protected $PPk='p_id';
	
	//新增预设数据
	protected $DataPre = [
		'id'=>'',
		'p_id' => '0',
		'sort' => '1',
		'status' => 1 
	];
	
    //系统初始化
    protected function initialize(){
		parent::initialize ();
		$this->Validate	= validate ('app\admin\validate\AuthGroup');
		$this->Model	= model('app\admin\model\AuthGroup');
		$this->Db		= db('AuthGroup');
    }

	/**
	 * @Name index
	 * @Title 首页
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月17日 
	 */
	public function index() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取请求数据
			$Parm = input ( 'post.' );
			// 初始化条件
			$Map = [];
			// 调用_ExtSort函数获取 排序条件
			$Sort = _ExtSort ( $Parm ['sort'] );
			//获取数据
			$List = $this->Model->where ( $Map )->order ( $Sort )->select ();
			// 对规则进行 有键值的树状化
			$Return = ['children'=>_Ext_ListToTree ( $List, $this->Pk, $this->PPk, 'children', 0 ,true),'expand'=>true];
			// 返回json数据
			return json ( $Return );
		} else {
			// 返回视图
			return view ();
		}
	}
    
	/**
	 * @Name add
	 * @Title 新增
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月17日 
	 */
	public function add() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$Parm = input ( 'post.' );
			// 验证数据 场景为add
			if ($this->Validate->scene ( 'add' )->check ( $Parm )) {
				// 数据写入 验证字段为数据库内字段 写入类型为新增
				$Result = $this->Model->allowField ( true )->isUpdate ( false )->save ( $Parm );
				// 判断执行结果
				if ($Result) {
					// 返回成功
					return _Code ( '200', '成功' );
				} else {
					// 返回失败
					$_Err = $this->Model->getError ();
					return _Code ( '201', $_Err ? $_Err : '失败' );
				}
			} else {
				// 验证失败 获取验证器的错误信息
				$_Err = $this->Validate->getError ();
				// 返回错误信息 如果没有错误信息 默认返回
				return _Code ( '301', $_Err ? $_Err : '数据验证失败' );
			}
		} else {
			return _Code ( '200', '成功', $this->DataPre );
		}
	}
	
	/**
	 * @Name edit
	 * @Title 更新
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月17日 
	 */
	public function edit() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$Parm = input ( 'post.' );
			if(!array_key_exists($this->Pk,$Parm)){
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 验证数据 场景为edit
			if ($this->Validate->scene ( 'edit' )->check ( $Parm )) {
				// 数据写入 验证字段为数据库内字段 写入类型为更新
				$Result = $this->Model->allowField ( true )->isUpdate ( true )->save ( $Parm, [ $this->Pk => $Parm[$this->Pk] ]);
				// 判断执行结果
				if ($Result) {
					// 返回成功
					return _Code ( '200', '成功' );
				} else {
					// 返回失败
					$_Err = $this->Model->getError ();
					return _Code ( '201', $_Err ? $_Err : '失败' );
				}
			} else {
				// 验证失败 获取验证器的错误信息
				$_Err = $this->Validate->getError ();
				// 返回错误信息 如果没有错误信息 默认返回
				return _Code ( '301', $_Err ? $_Err : '数据验证失败' );
			}
		} else {
			// 获取请求ID
			$ParmID = input ( $this->Pk, '' );
			// 验证参数
			if ($ParmID == '') {
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 读取数据
			$Result = $this->Model->where ( [ $this->Pk => $ParmID ] )->find ();
			// 判断数据是否正确
			if (! $Result) {
				// 返回错误信息
				return _Code ( '201', '数据不存在' );
			}
			// 返回json数据
			return _Code ( '200', '成功', $Result );
		}
	}
	
	/**
	 * @Name del
	 * @Title 删除
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月17日 
	 */
	public function del() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取请求ID
			$ParmID = input ( $this->Pk, '' );
			// 验证参数
			if ($ParmID == '') {
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 拆分字符串 因为前台可能会删除多条数据
			$ParmID = explode ( ',', $ParmID );
			foreach($ParmID as $K => $V){
				//判断角色的用户数
				$_UserCount = db('AuthGroupAccess')->where(['group_id'=>$V])->count ();
				if($_UserCount>0){
					return _Code ( '102', 'ID为 '.$V.' 的角色含有 ['.$_UserCount.'] 个用户,禁止删除' );
				}
			}
			// 删除数据
			$Result = $this->Model->destroy ( $ParmID );
			// 判断执行结果
			if ($Result) {
				// 返回成功
				return _Code ( '200', '成功' );
			} else {
				// 返回失败
				return _Code ( '201', '失败' );
			}
		}
	}
	/**
	 * 角色权限
	 */
	public function rules() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$Parm = input ( 'post.' );
			if(!array_key_exists($this->Pk,$Parm)){
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			$Result = $this->Db->where([$this->Pk => $Parm[$this->Pk]])->update($Parm);
			if ($Result) {
				return _Code('200', "操作成功！");
			} else {
				$_Error = $this->Model->getError();
				return _Code('202', $_Error ? $_Error : "操作失败！");
			}
		} else {
			$ParmID = input ($this->Pk, 0);
            if ($ParmID < 1) {
				return json([]);
            }
            $Result = $this->Model->find($ParmID);
            if (!$Result) {
				return json([]);
            }
			$RuleArr = _StrToArr($Result['rules'], ',');
			$AuthRuleResult = db('AuthRule')->field('id,p_id,title,icon as iconCls')->select();
			foreach($AuthRuleResult as $K => $V){
				if(in_array($V['id'],$RuleArr)){
					$AuthRuleResult[$K]['checked'] = true;
				}else{
					$AuthRuleResult[$K]['checked'] = false;
				}
				$AuthRuleResult[$K]['iconCls']	= 'tf '.$V['iconCls'];
				$AuthRuleResult[$K]['leaf']		= true;
				$AuthRuleResult[$K]['expanded']	= true;
				$AuthRuleResult[$K]['children']	= [];
			}
			$Return = _Ext_ListToTree($AuthRuleResult,'id','p_id','children',0);
			return json($Return);
		}
	}
}